﻿using System;

namespace Win32API
{
    public enum GetWindowCmd : uint
    {
        /// <summary>
        /// 返回的句柄标识了在Z序最高端的相同类型的窗口。
        /// 如果指定窗口是最高端窗口,则该句柄标识了在Z序最高端的最高端窗口；
        /// 如果指定窗口是顶层窗口,则该句柄标识了在z序最高端的顶层窗口：
        /// 如果指定窗口是子窗口,则句柄标识了在Z序最高端的同属窗口。
        /// </summary>
        GW_HWNDFIRST = 0,
        /// <summary>
        /// 返回的句柄标识了在z序最低端的相同类型的窗口。
        /// 如果指定窗口是最高端窗口,则该柄标识了在z序最低端的最高端窗口：
        /// 如果指定窗口是顶层窗口,则该句柄标识了在z序最低端的顶层窗口；
        /// 如果指定窗口是子窗口,则句柄标识了在Z序最低端的同属窗口。
        /// </summary>
        GW_HWNDLAST = 1,
        /// <summary>
        /// 返回的句柄标识了在Z序中指定窗口下的相同类型的窗口。
        /// 如果指定窗口是最高端窗口,则该句柄标识了在指定窗口下的最高端窗口：
        /// 如果指定窗口是顶层窗口,则该句柄标识了在指定窗口下的顶层窗口；
        /// 如果指定窗口是子窗口,则句柄标识了在指定窗口下的同属窗口。
        /// </summary>
        GW_HWNDNEXT = 2,
        /// <summary>
        /// 返回的句柄标识了在Z序中指定窗口上的相同类型的窗口。
        /// 如果指定窗口是最高端窗口,则该句柄标识了在指定窗口上的最高端窗口；
        /// 如果指定窗口是顶层窗口,则该句柄标识了在指定窗口上的顶层窗口；
        /// 如果指定窗口是子窗口,则句柄标识了在指定窗口上的同属窗口。
        /// </summary>
        GW_HWNDPREV = 3,
        /// <summary>
        /// 返回的句柄标识了指定窗口的所有者窗口（如果存在）。
        /// GW_OWNER与GW_CHILD不是相对的参数,没有父窗口的含义,如果想得到父窗口请使用GetParent()。
        /// 例如：例如有时对话框的控件的GW_OWNER,是不存在的。
        /// </summary>
        GW_OWNER = 4,
        /// <summary>
        /// 如果指定窗口是父窗口,则获得的是在Tab序顶端的子窗口的句柄,否则为NULL。
        /// 函数仅检查指定父窗口的子窗口,不检查继承窗口。
        /// </summary>
        GW_CHILD = 5,
        /// <summary>
        /// （WindowsNT 5.0）返回的句柄标识了属于指定窗口的处于使能状态弹出式窗口（检索使用第一个由GW_HWNDNEXT 查找到的满足前述条件的窗口）；
        /// 如果无使能窗口,则获得的句柄与指定窗口相同。
        /// </summary>
        GW_ENABLEDPOPUP = 6
    }

    [Flags]
    public enum SC : int
    {
        //窗体关闭消息
        SC_CLOSE = 0xf060,
        //窗体最小化消息
        SC_MINIMIZE = 0xf020,
        //窗体最大化消息
        SC_MAXIMIZE = 0xf030,
        //窗体正常态消息 SC_RESTORE = 0xf120,
        SC_NOMAL = 0xf120, 
    }

    [Flags]
    public enum NCmdShow : int
    {
        /// <summary>
        /// 隐藏窗口并激活其他窗口。nCmdShow
        /// </summary>
        SW_HIDE = 0,
        /// <summary>
        /// 正常态的窗口(非最大化和非最小化)
        /// 激活并显示一个窗口。如果窗口被最小化或最大化,系统将其恢复到原来的尺寸和大小。应用程序在第一次显示窗口的时候应该指定此标志
        /// </summary>
        SW_SHOWNORMAL = 1,
        /// <summary>
        /// 激活窗口并将其最小化
        /// </summary>
        SW_SHOWMINIMIZED = 2,
        /// <summary>
        /// 激活窗口并将其最大化
        /// </summary>
        SW_SHOWMAXIMIZED = 3,
        /// <summary>
        /// 最大化指定的窗口
        /// </summary>
        SW_MAXIMIZE = 3,
        /// <summary>
        /// 以窗口最近一次的大小和状态显示窗口。激活窗口仍然维持激活状态
        /// </summary>
        SW_SHOWNOACTIVATE = 4,
        /// <summary>
        /// 在窗口原来的位置以原来的尺寸激活和显示窗口
        /// </summary>
        SW_SHOW = 5,
        /// <summary>
        /// 最小化指定的窗口并且激活在Z序中的下一个顶层窗口
        /// </summary>
        SW_MINIMIZE = 6,
        /// <summary>
        /// 窗口最小化,激活窗口仍然维持激活状态
        /// </summary>
        SW_SHOWMINNOACTIVE = 7,
        /// <summary>
        /// 以窗口原来的状态显示窗口。激活窗口仍然维持激活状态
        /// </summary>
        SW_SHOWNA = 8,
        /// <summary>
        /// 激活并显示窗口。如果窗口最小化或最大化,则系统将窗口恢复到原来的尺寸和位置。在恢复最小化窗口时,应用程序应该指定这个标志
        /// </summary>
        SW_RESTORE = 9,
        /// <summary>
        /// 依据在STARTUPINFO结构中指定的SW_FLAG标志设定显示状态,STARTUPINFO 结构是由启动应用程序的程序传递给CreateProcess函数的
        /// </summary>
        SW_SHOWDEFAULT = 10,
        /// <summary>
        /// 在WindowNT5.0中最小化窗口,即使拥有窗口的线程被挂起也会最小化。在从其他线程最小化窗口时才使用这个参数
        /// </summary>
        SW_FORCEMINIMIZE = 11,
    }


    public enum WS : uint
    {
        // 窗口风格
        WS_CAPTION = 0xC00000,         // 带标题栏的窗口
        WS_MAXIMIZEBOX = 0x10000,      // 带最大化按钮的窗口
        WS_MINIMIZEBOX = 0x20000,      // 带最小化按钮的窗口
        WS_SYSMENU = 0x80000,          // 带系统菜单的窗口
        WS_CLIPSIBLINGS = 0x4000000,   // 不重绘层叠子窗口
        WS_CLIPCHILDREN = 0x2000000,   // 绘图时排子窗口区域
        WS_OVERLAPPED = 0x0,          // 具有标题栏和边框的层叠窗口
        WS_THICKFRAME = 0x40000,       // 具有可调边框
                                       // WS_OVERLAPPEDWINDOW具有标题栏、窗口菜单、可调边框和最大化、最小化按钮的窗口
        WS_OVERLAPPEDWINDOW = WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME | WS_MINIMIZEBOX | WS_MAXIMIZEBOX,
        WS_GROUP = 0x20000,            // 指定一组控制的第一个控制
        WS_POPUP = 0x80000000,         // 弹出式窗口
        WS_BORDER = 0x800000,          // 单边框窗口
        WS_POPUPWINDOW = WS_POPUP | WS_BORDER | WS_SYSMENU, // 具有单边框、标题栏菜单的弹出式窗口
        WS_MINIMIZE = 0x20000000,      // 窗口最小化
        WS_VISIBLE = 0x10000000,       // 窗口可见
        WS_DISABLED = 0x8000000,       // 窗口被禁用
        WS_MAXIMIZE = 0x1000000,       // 窗口最大化
        WS_DLGFRAME = 0x400000,        // 对话框边框风格
        WS_VSCROLL = 0x200000,         // 具有垂直滚动条
        WS_HSCROLL = 0x100000,         // 具有水平滚动条
        WS_TABSTOP = 0x10000,          // 具有TAB键控制
        WS_CHILD = 0x40000000,         //设置窗口属性为child 多文档界面的子窗体
        WS_CHILDWINDOW = WS_CHILD,     // 具有子窗口

        // 扩展风格
        WS_EX_WINDOWEDGE = 0x100,         // 窗口具有凸起的3D边框
        WS_EX_CLIENTEDGE = 0x200,         // 窗口具有阴影边界
        WS_EX_TOOLWINDOW = 0x80,          // 小标题工具窗口
        WS_EX_TOPMOST = 0x8,              // 窗口总在顶层  const int WS_EX_TOPMOST = 0x00000008;
        WS_EX_OVERLAPPEDWINDOW = WS_EX_WINDOWEDGE | WS_EX_CLIENTEDGE, // WS_EX-CLIENTEDGE和WS_EX_WINDOWEDGE的组合
        WS_EX_PALETTEWINDOW = WS_EX_WINDOWEDGE | WS_EX_TOOLWINDOW | WS_EX_TOPMOST, // WS_EX_WINDOWEDGE和WS_EX_TOOLWINDOW和WS_EX_TOPMOST的组合
        WS_EX_DLGMODALFRAME = 0x1,        // 带双边的窗口
        WS_EX_NOPARENTNOTIFY = 0x4,       // 窗口在创建和销毁时不向父窗口发送WM_PARENTNOTIFY消息
        WS_EX_TRANSPARENT = 0x20,         // 窗口透眀
        WS_EX_MDICHILD = 0x40,            // MDI子窗口
        WS_EX_CONTEXTHELP = 0x400,        // 标题栏包含问号联机帮助按钮
        WS_EX_RIGHT = 0x1000,             // 窗口具有右对齐属性
        WS_EX_RTLREADING = 0x2000,        // 窗口文本自右向左显示
        WS_EX_LEFTSCROLLBAR = 0x4000,     // 标题栏在客户区的左边
        WS_EX_CONTROLPARENT = 0x10000,     // 允许用户使用Tab键在窗口的子窗口间搜索
        WS_EX_STATICEDGE = 0x20000,        // 为不接受用户输入的项创建一个三维边界风格
        WS_EX_APPWINDOW = 0x40000,         // 在任务栏上显示顶层窗口的标题按钮
        WS_EX_LAYERED = 0x80000,           // 窗口具有透眀属性(Win2000)以上
        WS_EX_NOINHERITLAYOUT = 0x100000, // 窗口布局不传递给子窗口(Win2000)以上
        WS_EX_LAYOUTRTL = 0x400000,        // 水平起点在右边的窗口
        WS_EX_NOACTIVATE = 0x8000000,      // 窗口不会变成前台窗口(Win2000)以上
        WS_EX_LEFT = 0x0,                 // 窗口具有左对齐属性
        WS_EX_LTRREADING = 0x0,           // 窗口文本自左向右显示
        WS_EX_RIGHTSCROLLBAR = 0x0,       // 垂直滚动条在窗口的右边界
        WS_EX_ACCEPTFILES = 0x10,         // 接受文件拖曳
        WS_EX_COMPOSITED = 0x2000000,      // 窗体所有子窗口使用双缓冲从低到高绘制(XP)
    }

    public enum GWL : int
    {
        /// <summary>
        /// 获取、设置窗口过程的地址
        /// </summary>
        GWL_WNDPROC = -4,
        /// <summary>
        /// 获取应用程序的实例句柄
        /// </summary>
        GWL_HINSTANCE = -6,
        /// <summary>
        /// 获取父窗口句柄
        /// </summary>
        GWL_HWNDPARENT = -8,
        /// <summary>
        /// 获取窗口标识
        /// </summary>
        GWL_ID = -12,
        /// <summary>
        /// 获取、设置窗口样式
        /// </summary>
        GWL_STYLE = -16,
        /// <summary>
        /// 获取、设置窗口扩展样式
        /// </summary>
        GWL_EXSTYLE = -20,
        /// <summary>
        /// 获取、设置与窗口关联的自定义数据
        /// </summary>
        GWL_USERDATA = -21,
    }
}
